package rhplus.servico;

import java.sql.Date;


import java.util.Iterator;
import java.util.LinkedList;
import javax.jdo.PersistenceManager;
import rhplus.acessoBD.PMF;

public class Pagamento {

	public Pagamento(final Long id_pagamento, final LinkedList<Servico> lista_de_servicos, final String tipo, final Date data,
			final String numero_de_cheque, final String tipo_de_cartao, final String numero_de_cartao, final Date data_de_validade_do_cartao) {
		this.id_pagamento = id_pagamento;
		this.lista_de_servicos = lista_de_servicos;
		this.tipo = tipo;
		this.data = data;
		this.numero_de_cheque = numero_de_cheque;
		this.tipo_de_cartao = tipo_de_cartao;
		this.numero_de_cartao = numero_de_cartao;
		this.data_de_validade_do_cartao = data_de_validade_do_cartao;
	}

	public Pagamento(final Long id_pagamento, final LinkedList<Servico> lista_de_servicos, final String tipo, final Date data,
			final String numero_de_cheque, final String tipo_de_cartao, final String numero_de_cartao, final Date data_de_validade_do_cartao,
			final Factura factura) {
		this.id_pagamento = id_pagamento;
		this.lista_de_servicos = lista_de_servicos;
		this.tipo = tipo;
		this.data = data;
		this.numero_de_cheque = numero_de_cheque;
		this.tipo_de_cartao = tipo_de_cartao;
		this.numero_de_cartao = numero_de_cartao;
		this.data_de_validade_do_cartao = data_de_validade_do_cartao;
		this.factura = factura;
	}

	public Long getIdPagamento() {
		return id_pagamento;
	}

	public LinkedList<Servico> getListaDeServicos() {
		return lista_de_servicos;
	}

	public String getTipo() {
		return tipo;
	}

	public Date getData() {
		return data;
	}

	public double getValorTotal() {
		double valor_total = 0;
		for (Servico servico : lista_de_servicos) {
			valor_total = valor_total + servico.getPreco() * (1 - servico.getPercentagem());
		}

		return valor_total;
	}

	public String getNumeroDeCheque() {
		return numero_de_cheque;
	}

	public String getTipoDeCartao() {
		return tipo_de_cartao;
	}

	public String getNumeroDeCartao() {
		return numero_de_cartao;
	}

	public Date getDataDeValidadeDoCartao() {
		return data_de_validade_do_cartao;
	}

	public Factura getFactura() {
		return factura;
	}

	public boolean temFacturaEmitida() {
		return factura != null;
	}

	public LinkedList<Servico> getServicos() {
		return this.lista_de_servicos;
	}

	public void adicionaServico(final Long id_servico) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

		Servico servico = Servico.devolve(id_servico);
		servico.paga(this.getIdPagamento());
		this.lista_de_servicos.add(servico);

                PersistenceManager pm = PMF.get().getPersistenceManager();
		try {
                    pm.makePersistent(servico);
                     } finally {
                    pm.close();
                     }
	}

	public Servico devolveServico(final Long id_servico) {
		// Procura o servico associada ao identificador.
		Iterator<Servico> iterator = lista_de_servicos.iterator();
		while (iterator.hasNext()) {
			Servico servico = iterator.next();
			if (servico.equals(id_servico))
				return servico;
		}

		// Se o Servico nao foi encontrado devolve null.
		return null;
	}

	public void removeServico(final Long id_servico) {
		// Procura o servico associada ao identificador.
		Iterator<Servico> iterator = lista_de_servicos.iterator();
		while (iterator.hasNext()) {
			Servico servico = iterator.next();
			if (servico.equals(id_servico)) {
				//servico.removePagamento();
				iterator.remove();
			}
		}
	}

	public void emiteFactura() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		//Factura.insere(this.data, this.id_pagamento);
	}

	public static Pagamento devolve(final int id_pagamento) throws ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		// Consulta a BD
		PersistenceManager pm = PMF.get().getPersistenceManager();

                String query = "select from " + Pagamento.class.getName()
                + " where id_pagamento == " + id_pagamento;

                Pagamento  pagamento = (Pagamento) pm.newQuery(query).execute();

                return pagamento;


		
	}

	public static void insere(final Pagamento pagamento) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException {

                  PersistenceManager pm = PMF.get().getPersistenceManager();

                     try {
                    pm.makePersistent(pagamento);
                     } finally {
                    pm.close();
                     }

                    }

	public static void remove(final int id_pagamento) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

            PersistenceManager pm = PMF.get()
			.getPersistenceManager();
	try {
		pm.currentTransaction().begin();

		// We don't have a reference to the selected Product.
		// So we have to look it up first,
		Pagamento pagamento = pm.getObjectById(Pagamento.class,id_pagamento);
		pm.deletePersistent(pagamento);

		pm.currentTransaction().commit();
	} catch (Exception ex) {
		pm.currentTransaction().rollback();
		throw new RuntimeException(ex);
	} finally {
		pm.close();
	}
		
	}

	

	public static LinkedList<String> devolveTiposDePagamento() throws ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		// Consulta a BD
		PersistenceManager pm = PMF.get().getPersistenceManager();
                // NAO TENHO A CERTEZA SE O DISTINC FUNCIONA OU NAO.
                String query = "select DISTINCT tipo_pagamento FROM pagamento";

                LinkedList<String>  tiposPagamento = (LinkedList<String>) pm.newQuery(query).execute();

		return tiposPagamento;
	}

	// Atributos
	private Factura factura;
	private Long id_pagamento;
	private String tipo, numero_de_cheque, tipo_de_cartao, numero_de_cartao;
	private Date data, data_de_validade_do_cartao;
	private LinkedList<Servico> lista_de_servicos;
	public static final String NUMERARIO = "numerario";
	public static final String CHEQUE = "cheque";
	public static final String CARTAO = "cartao";
}
